/**
 * 权限管理页面业务逻辑处理模块
 * 提供页面所需的工具函数和业务处理方法
 */

/**
 * 权限等级映射
 * @readonly
 * @enum {string}
 */
export const ACCESS_LEVEL = {
  WHITE: 'white',        // 白名单 - 无需验证
  LOGIN: 'login',        // 登录 - 需要登录
  PERMISSION: 'permission', // 权限 - 需要特定权限
  REFUSE: 'refuse'       // 拒绝 - 禁止访问
}

/**
 * 权限等级数值映射
 * @readonly
 * @enum {number}
 */
export const ACCESS_LEVEL_CODE = {
  WHITE: 0,
  LOGIN: 1,
  PERMISSION: 2,
  REFUSE: 9
}

/**
 * 读取页面权限配置
 * @returns {Object} 权限配置对象
 */
export const getPageAccessConfig = () => {
  try {
    // 动态导入同级JSON配置文件
    return require('./Index.json')
  } catch (error) {
    console.error('读取权限配置失败:', error)
    return {
      access: {
        level: ACCESS_LEVEL.REFUSE,
        description: '配置读取失败，默认拒绝访问'
      }
    }
  }
}

/**
 * 检查用户是否有访问权限
 * @param {string} userLevel - 用户权限等级
 * @param {string} requiredLevel - 所需权限等级
 * @returns {boolean} 是否有权限
 */
export const checkAccessPermission = (userLevel, requiredLevel) => {
  const levelPriority = {
    [ACCESS_LEVEL.WHITE]: 0,
    [ACCESS_LEVEL.LOGIN]: 1,
    [ACCESS_LEVEL.PERMISSION]: 2,
    [ACCESS_LEVEL.REFUSE]: 9
  }
  
  return levelPriority[userLevel] >= levelPriority[requiredLevel]
}

/**
 * 验证特定权限代码
 * @param {string[]} userPermissions - 用户权限列表
 * @param {string} requiredPermission - 所需权限代码
 * @returns {boolean} 是否有权限
 */
export const validatePermission = (userPermissions, requiredPermission) => {
  return userPermissions.includes(requiredPermission)
}

/**
 * 格式化权限等级显示文本
 * @param {string} level - 权限等级
 * @returns {string} 格式化后的文本
 */
export const formatAccessLevelText = (level) => {
  const levelTextMap = {
    [ACCESS_LEVEL.WHITE]: '白名单',
    [ACCESS_LEVEL.LOGIN]: '需登录',
    [ACCESS_LEVEL.PERMISSION]: '需权限',
    [ACCESS_LEVEL.REFUSE]: '拒绝访问'
  }
  
  return levelTextMap[level] || '未知等级'
}

/**
 * 获取权限等级对应的Element Plus标签类型
 * @param {string} level - 权限等级
 * @returns {string} 标签类型
 */
export const getAccessLevelTagType = (level) => {
  const tagTypeMap = {
    [ACCESS_LEVEL.WHITE]: 'success',
    [ACCESS_LEVEL.LOGIN]: 'primary', 
    [ACCESS_LEVEL.PERMISSION]: 'warning',
    [ACCESS_LEVEL.REFUSE]: 'danger'
  }
  
  return tagTypeMap[level] || 'info'
}

/**
 * 权限检查中间件
 * @param {Function} next - 下一步回调
 * @param {Object} options - 配置选项
 * @param {Object} options.user - 用户信息
 * @param {Object} options.config - 权限配置
 * @returns {boolean|void} 权限检查结果
 */
export const accessMiddleware = (next, options = {}) => {
  const { user, config } = options
  const { level, permission } = config?.access || {}
  
  // 检查基本访问权限
  if (!checkAccessPermission(user?.accessLevel, level)) {
    return false
  }
  
  // 如果需要特定权限，检查权限代码
  if (level === ACCESS_LEVEL.PERMISSION && permission?.required) {
    if (!validatePermission(user?.permissions || [], permission.code)) {
      return false
    }
  }
  
  // 权限检查通过，执行下一步
  if (typeof next === 'function') {
    next()
  }
  
  return true
}

/**
 * 导出权限配置工具类
 */
export class AccessConfigManager {
  constructor(configPath = './Index.json') {
    this.configPath = configPath
    this.config = null
    this.lastLoadTime = 0
  }
  
  /**
   * 加载配置文件
   * @param {boolean} force - 是否强制重新加载
   * @returns {Object} 配置对象
   */
  loadConfig(force = false) {
    const now = Date.now()
    
    // 缓存5分钟，避免频繁读取文件
    if (!force && this.config && (now - this.lastLoadTime) < 300000) {
      return this.config
    }
    
    try {
      this.config = getPageAccessConfig()
      this.lastLoadTime = now
      return this.config
    } catch (error) {
      console.error('加载权限配置失败:', error)
      return null
    }
  }
  
  /**
   * 获取当前页面访问等级
   * @returns {string} 访问等级
   */
  getAccessLevel() {
    const config = this.loadConfig()
    return config?.access?.level || ACCESS_LEVEL.REFUSE
  }
  
  /**
   * 获取所需权限代码
   * @returns {string|null} 权限代码
   */
  getRequiredPermission() {
    const config = this.loadConfig()
    return config?.permission?.code || null
  }
  
  /**
   * 验证用户权限
   * @param {Object} user - 用户对象
   * @returns {boolean} 验证结果
   */
  validateUserAccess(user) {
    const level = this.getAccessLevel()
    const permission = this.getRequiredPermission()
    
    return accessMiddleware(null, {
      user,
      config: {
        access: { level },
        permission: { required: true, code: permission }
      }
    })
  }
}

/**
 * 默认导出便捷方法
 */
export default {
  // 枚举常量
  ACCESS_LEVEL,
  ACCESS_LEVEL_CODE,
  
  // 工具函数
  getPageAccessConfig,
  checkAccessPermission,
  validatePermission,
  formatAccessLevelText,
  getAccessLevelTagType,
  accessMiddleware,
  
  // 工具类
  AccessConfigManager
}